class Ball extends BodyComponent with TapCallbacks {
Ball({Vector2? initialPosition})
: super(
fixtureDefs: [
FixtureDef(
CircleShape()..radius = 5,
restitution: 0.8,
friction: 0.4,
),
],
bodyDef: BodyDef(
angularDamping: 0.8,
position: initialPosition ?? Vector2.zero(),
type: BodyType.dynamic,
),
);
@override
void onTapDown(_) {...}
}
class Wall extends BodyComponent {
final Vector2 _start;
final Vector2 _end;
Wall(this._start, this._end);
@override
Body createBody() {
final shape = EdgeShape()..set(_start, _end);
final fixtureDef = FixtureDef(shape, friction: 0.3);
final bodyDef = BodyDef(
position: Vector2.zero(),
);
return world.createBody(bodyDef)..createFixture(fixtureDef);
}
}
上一篇講到這個官方範例,今天再用一次。
可以看到BodyComponent在設計上有兩種策略,一是使用建構子、二是使用「createBody」這個函數。
而在createBody中,可以看到world都有相對相似名稱的函數接口去接收建構子中使用到的參數。
這兩個範例主要使用了兩個參數「fixtureDefs」和「bodyDef」,它們也有自己對應並專屬的物件類別「FixtureDef」和「BodyDef」。
靠著一次介紹了兩種不同類型的BodyComponent和不同的使用方式,我們可以一次了解很多東西...
但其實還不夠多。
比如「BodyType.dynamic」這個參數如果修改成「BodyType.static」,則這個BodyComponent會被固定在初始化時賦予的位置上。
比如範例在「FixtureDef」產生時傳入的第一項參數決定了這個BodyComponent的形裝類別,但有哪些形狀類別可以使用?
比如範例在「FixtureDef」產生時傳入的第二項參數「restitution」決定了這個BodyComponent和其他BodyComponent發生碰撞時的彈力大小,但不知道第三項參數的功用?(調整後看不出差異。)
如果要將一個物體設定為「發生碰撞時不旋轉」,就在BodyDef中設定「fixedRotation = true」。
(慢慢研究剩下的參數有何涵義與功能。)
例外,可以看到Forge2D也提供了「TapCallbacks」,還有「DragCallbacks」,只是沒有在範例中使用。